# testes-plot.R

# Exemplo de uso:
#
# source('testes-plot.R')
# PlotTestesPvalue()
# PlotTestesLogPvalue()
# PlotTestesErro()
#
# PlotPvalueErroLogNormalShapiro()
# PlotPvalueErroLogNormalLillie()
# PlotPvalueErroGamma()
#
# source('dados.R')
# PlotDists(Danos(5), 5)

TestesCores <- c(
	'green', 'blue', 'red', 'black', 'brown', 'violet')

MIN_RETENCAO <- 2
MAX_RETENCAO <- 50 #+1.5

PlotTestes <- function(descr, ylabel, TesteFns, TestesNomes, DadosFn, TransfFn = identity, inv=FALSE, drawLegend=TRUE)
{
	R <- seq(MIN_RETENCAO, MAX_RETENCAO, .1)
	Y <- rep(0, length(R))
	c <- 1
	for(f in TesteFns) {
		for(i in 1:length(R)) {
			dados <- TransfFn(DadosFn(R[i]))
			Y[i] <- f(dados)
		}
		if(inv)
			Y <- 1-Y
		if(c == 1)
			p <- plot
		else
			p <- lines
		p(R, Y, type='l', main=descr, col=TestesCores[c], lwd=2,
			xlim=c(R[1], R[length(R)]), ylim=c(0, 1),
			xlab='retenção', ylab=ylabel, cex.main = .9, cex.lab = .8)
		c <- c+1
	}
	if(drawLegend) {
		testesn <- length(TesteFns)
		if(inv)
			pos <- 'bottomright'
		else
			pos <- 'topleft'
		legend(pos, TestesNomes, title='Teste:',
			title.adj=.05,
			lty=rep(1, testesn), lwd=rep(2, testesn),
			col=TestesCores, bg='white', cex=.6)
	}
}

source('dados.R')
source('testes-pvalue.R')

PlotTestesPvalue <- function()
	PlotTestes('Dados', 'p-value', TestesFn, TestesNome, Danos, identity)

PlotTestesLogPvalue <- function()
	PlotTestes('Log(Dados)', 'p-value', TestesFn, TestesNome, Danos, log, drawLegend=FALSE)

source('testes-erro.R')

PlotTestesErro <- function()
	PlotTestes('Dados', '1 - erro', TestesErro, TestesErroNomes, Danos, inv=TRUE)

## Experiência .. ver correlação entre pvalue e o nosso erro

PlotPvalueErro <- function(tipostr, PvalueFn, ErroFn, DadosFn, TransfFn) {
	R <- seq(MIN_RETENCAO, MAX_RETENCAO, .1)
	P <- rep(0, length(R))
	E <- rep(0, length(R))
	c <- 1
	for(i in 1:length(R)) {
		dados <- DadosFn(R[i])
		P[i] <- PvalueFn(TransfFn(dados))
		E[i] <- 1-ErroFn(dados)
	}

	plot(E, P, type='l',
		main=paste('p-value / erro várias retenções\npara', tipostr),
		cex.main = .9, cex.lab = .8,
		col='blue', lwd=2,
		xlim=c(0, 1), ylim=c(0, 1),
		xlab='1 - erro', ylab='p-value')
}

PlotPvalueErroLogNormalShapiro <- function()
	PlotPvalueErro('Shapiro / Log-normal',
		TesteNormalShapiro, CalcErroLogNormal, Danos, log)

PlotPvalueErroLogNormalLillie <- function()
	PlotPvalueErro('Lillie / Log-normal',
		TesteNormalLillie, CalcErroLogNormal, Danos, log)

PlotPvalueErroGamma <- function(dados)
	PlotPvalueErro('Gamma',
		TesteGamma, CalcErroGamma, Danos, identity)


## Histograms

TesteLogNormalShapiro <- function(Dados)
	TesteNormalShapiro(log(Dados))

PlotDists <- function(Dados, r, DrawEmpirica = TRUE)
{
	DistCores <- c(
		'green', 'blue', 'brown', 'violet', 'gray')
	Dists <- c(DistNormal, DistLogNormal, DistGamma, DistExp)
	DistNames <- c("Normal", "Log-Normal", "Gamma", "Exponencial")

	# plot
	title <- paste('Histograma vs distribuições, retenção:', r)
	hist(Dados, freq=FALSE, main=title,
		xlab='danos (mil milhões de euros)', ylab='probabilidade',
		cex.main = .9, cex.lab = .8)

	i <- 1
	for(Dist in Dists) {
		#readline()
		D <- Dist(Dados)
		lines(D$X, D$Y, lwd=2, col=DistCores[i])
		i <- i+1
	}
	if(DrawEmpirica) {
		Dens <- density(Dados, n=DIST_LEN, from=min(Dados), to=max(Dados))
		lines(Dens$x, Dens$y, lwd=2,
			col=DistCores[length(DistCores)])
		DistNames[length(DistNames)+1] <- 'empirica'
	}

	TestePvalues <- c(TesteNormalShapiro, TesteLogNormalShapiro, TesteGamma, TesteExp)
	i <- 1
	for(pfn in TestePvalues) {
		pvalue <- pfn(Dados)$pvalue
		if(pvalue < 0.05)
			pvalue = 0
		DistNames[i] <- paste(DistNames[i], '(', format(pvalue, digits=3), ')')
		i <- i+1
	}

	legend('topright', DistNames,
		title='Distribuição:', title.adj=.05,
		lty=rep(1, 1), lwd=c(2, 2),
		col=DistCores, bg='white', cex=.6)
}

